<? 
/*** 
Config.class.php - методы для удобной раоыт с конфигами и настрйоками системы и модулями
***

Методы:

cfg($module='') - функция для удобного доступа к конфиг-объекту. Без аргументов возвращает конфиг-объект системы (ядра, core). 
(синоним Config::cfg() )


Примеры:
	$cfg = cfg();
	$cfg->DATA_URL = '/data/';
	cfg()->DATA_URL = '/data/';
	cfg('Blog')->listing_limit = 20;
	pr(cfg());

cfg($module='')->set($properties) - записывает сразу несколько oпций в соответствующий конфиг-объект.
		
Примеры: 	
	Добавляем опции в конфиг ядра:
	cfg()->set(array(
		'SITE_ROOT'	=> $_SERVER['DOCUMENT_ROOT'],
		'SITE_URL'	=> 'http://'.$_SERVER['HTTP_HOST'],
	
	));
	Добавляем опции в конфиг модуля:
	cfg('design')->set(array(
		'theme_id'	=> 'blue',
		'blocks'	=> 1,
	
	));

	
Config::apply() - применяет все стандартные действия к установленным конфигам:
		- конфиг-опции из больших букв - переводит в константы
		- задает CHARSET и LOCAL для документа и работы функций PHP
	
***/


 
header('Content-Type: text/html;charset=UTF-8'  );
    

function cfg($module=''){ return Config::cfg($module); }

class Config 
{
	/* Статические методы класса  */
	
	// хранилище для конфиг-объектов
	static $Configs=array();
	
	// сингелтон
	private function __construct(){}
	
	// создает или возращает созданный ранее конфиг-объект
	static public function cfg($module='')
	{
		if (!$module) $module='core';
		if (!isset(self::$Configs[$module])) 
			self::$Configs[$module] = new Config();
		return 	self::$Configs[$module];
	}
	
	// "Применяет" все накопленные конфиги
	static public function apply()
	{
		// переводим в константы все свойства в верхнем регистре 
		$cfg = self::cfg();
		
		foreach ($cfg->properties AS $name=>$value)
		{
			if (strtoupper($name)==$name 
				&& !defined($name)
				)
				define($name, $value);
		}
		
		// применяем настройки кодировки и локали
		if ($cfg->LOCALE)  setlocale(LC_ALL, $cfg->LOCALE);
		if ($cfg->CHARSET)
		{
			mb_internal_encoding($cfg->CHARSET);
			header('Content-Type: text/html;charset=' . $cfg->CHARSET);
		}
		//:TODO: добавить в .htaccess для перезагрузки строковых функций типа 
		// mb_strpos=>strpos:  php_value mbstring.func_overload "7" 
	
		// задаём временную зону
		if ($cfg->TIMEZONE)  date_default_timezone_set($cfg->TIMEZONE);
		// :TODO: перенести в редактируемые настройки админки
		// временную зона по умолчанию (может изменятся через админку)
	   
	}
	
	
	
	/* Экзеплярные методы конфиг-объекта */
	
	
	// хранилище для свойств конфиг-объекта
	public $properties=array();
	
	// запись в произвольное свойство конфиг-обекта
	public function __set($name, $val)
	{
		$this->properties[$name] = $val;
	}
	// чтение произвольного свойства конфиг-объекта
	public function __get($name)
	{
		return isset($this->properties[$name])? 
					 $this->properties[$name] : false;
	}
	
	// записывает несколько опций в конфиг-объект 
	public function set($props)
	{
		foreach ((array)$props AS $name=>$val) 
		{
			$this->properties[$name] = $val;
		}
	}
	
	
	

}

